feat(open): add 'open vscode' and 'open ssms', remove retired 'open ads'#688
Open
dlevy-msft-sql wants to merge 66 commits into
Open
feat(open): add 'open vscode' and 'open ssms', remove retired 'open ads'#688dlevy-msft-sql wants to merge 66 commits into
dlevy-msft-sql wants to merge 66 commits into
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds support for opening Visual Studio Code and SQL Server Management Studio (SSMS) to work with SQL Server connections managed by sqlcmd, addressing the deprecation of Azure Data Studio. The implementation uses clipboard-based password sharing since both tools use sandboxed credential storage.
Changes:
- Adds
sqlcmd open vscodecommand that creates connection profiles in VS Code settings and auto-installs the MSSQL extension - Adds
sqlcmd open ssmscommand (Windows-only) that launches SSMS with pre-configured connection parameters - Implements cross-platform clipboard support for secure password sharing
- Includes comprehensive tests and documentation updates
Reviewed changes
Copilot reviewed 30 out of 31 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
cmd/modern/root/open.go |
Updates open command to include VSCode and SSMS subcommands |
cmd/modern/root/open/vscode.go |
Main VSCode command implementation with settings file manipulation |
cmd/modern/root/open/vscode_*.go |
Platform-specific VSCode implementations |
cmd/modern/root/open/ssms.go |
Main SSMS command implementation |
cmd/modern/root/open/ssms_*.go |
Platform-specific SSMS implementations (Fatal on non-Windows) |
cmd/modern/root/open/clipboard.go |
Helper function for clipboard-based password sharing |
cmd/modern/root/open/*_test.go |
Comprehensive test coverage for new commands |
internal/tools/tool/vscode*.go |
VSCode tool detection and configuration |
internal/tools/tool/ssms*.go |
SSMS tool detection and configuration |
internal/pal/clipboard*.go |
Cross-platform clipboard implementation using native APIs |
internal/tools/tools.go |
Registers VSCode and SSMS tools |
README.md |
Adds clear documentation with usage examples |
.gitignore |
Adds /modern build artifact |
Removes the mssql.connections entry (and any inline password persisted for container-backed endpoints) from both stable and insiders VS Code settings.json when the underlying sqlcmd context is deleted. Best-effort: missing files or parse errors never fail the delete. JSONC comments and unrelated keys are preserved via hujson Patch.
Two security comments from Copilot review: - clipExePath returned bare 'clip.exe' when SystemRoot was unset, which re-introduces the PATH/cwd search the comment said we were avoiding. Chain SystemRoot -> WINDIR -> SystemDrive\Windows before defaulting to an absolute C:\Windows\System32\clip.exe. - vscodeWindowsBuildInfo built tier-3 install paths by joining USERPROFILE/ProgramFiles unconditionally; when either env var was empty, filepath.Join produced a relative path (e.g. AppData\...\Code.exe) that could match a binary in the working directory. Skip tier-3 entries whose base env var is empty.
This was referenced Jun 1, 2026
… context Without a current context, both commands would call config.CurrentContext() (returning zero-value endpoint/user) and proceed to write an empty profile or launch with an empty host. Match start/stop/uninstall by exiting with 'No current context' and a hint to 'sqlcmd config get-contexts'.
When HOME was unset, filepath.Join produced relative per-user paths (.local/bin/code, Applications/Visual Studio Code.app) that could match an unintended binary or directory in the working directory. Skip those entries when HOME is empty.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 64 out of 76 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
cmd/modern/root/open/ssms_test.go:35
- This test mutates the global internal/config state but doesn’t reset it. Other tests in this package (e.g. vscode_test.go) also add an endpoint/context named "endpoint"/"context", and because config.AddEndpoint/AddContext uniquify names when duplicates exist, whichever test runs second can end up with mismatched names and panic. Add config.Clean() after TestSetup (or capture the actual endpoint/context names returned by the add helpers).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds two new subcommands and removes one that no longer applies:
sqlcmd open vscode— writes a connection profile for the current context into VS Code'ssettings.jsonand launches VS Code on it via thevscode://URL handler (which prompts to install the MSSQL extension on first use if needed).sqlcmd open ssms— launches SSMS connected to the current context (Ssms.exe -S host,port -nosplash [-C] [-U user]with the password handed off via the clipboard).sqlcmd open adsis removed: Azure Data Studio was retired in August 2025.Password handling for VS Code
The VS Code profile includes the SQL password inline in
settings.jsonrather than prompting the user for it.sqlcmd's containers are short-lived local development instances with throwaway credentials, and the goal ofopen vscodeis one-shot, zero-prompt connect. The MSSQL extension migrates the password out ofsettings.jsonand into the OS credential store on first read, so the on-disk window is brief; we accept that trade-off in exchange for not requiring the user to paste a password they did not choose. This applies only to the local-container dev flow; users connecting to real servers should manage credentials through the extension directly.Editor discovery (Windows)
PATH(code/code-insiders) → Inno Setup uninstall registry → default install dirs.--build stable|insidersselects which build to launch; the connection profile is written to that build'ssettings.jsonso the profile and the launched build always match.vswhere -products Microsoft.VisualStudio.Product.Ssms, which finds SSMS 21+ on any drive.--versionpins a major version; values below 21 are rejected (older SSMS releases are legacy-MSI and aren't registered with the VS Installer).Why not
ssms://?An earlier revision used the
ssms://protocol handler. Its grammar only acceptss/a/u/d/h/q/dnand silently drops-C(trust server certificate) and-P. Local container connections need-C, so the URL path could not connect to a fresh local SQL container regardless of SSMS version. That commit was reverted; the argv launch path is what ships.Testing
go build ./...on windows/linux/darwingo test ./internal/tools/tool/... ./cmd/modern/root/open/...settings.jsonrouting.